﻿#ifndef CONNECTINGWINDOW_H
#define CONNECTINGWINDOW_H

#include <QWidget>
#include <QEvent>
#include <QList>
#include <QPair>
#include <QSet>
#include <QHash>
#include <QToolButton>
#include <QGridLayout>
#include "common/deviceattributes.h"
#include "model/datamanager.h"

class QLabel;
class NodeWidget;

/**
 * @brief ConnectingWindow
 * @details 显示硬件节点连接关系的界面组件，支持不同模板模式的节点布置。
 */
class ConnectingWindow : public QWidget
{
    Q_OBJECT
public:
    /**
     * @brief ConnectingWindow::ConnectingWindow
     * @details 构造连接窗口并根据模板类型初始化节点。
     * @param type 模板类型（RS/CS）。
     * @param parent Qt 父对象。
     */
    explicit ConnectingWindow(HardwareTemplateType type, QWidget *parent = nullptr);
    /**
     * @brief ConnectingWindow::~ConnectingWindow
     * @details 默认析构释放资源。
     */
    ~ConnectingWindow() override;

    /**
     * @brief ConnectingWindow::initUI_RS
     * @details 初始化辐射模板的节点布局。
     */
    void initUI_RS();
    /**
     * @brief ConnectingWindow::initUI_CS
     * @details 初始化传导模板的节点布局。
     */
    void initUI_CS();

    /**
     * @brief ConnectingWindow::setSubRangeName
     * @details 设置子频段名称。
     * @param subRangeName 名称字符串。
     */
    void setSubRangeName(const QString &subRangeName);
    /**
     * @brief ConnectingWindow::setData
     * @details 将模板数据加载到节点控件。
     * @param hwTemplate 硬件模板指针。
     */
    void setData(const HardwareTemplatePtr &hwTemplate);
    /**
     * @brief ConnectingWindow::getHardwareTemplate
     * @details 返回内部持有的模板数据引用。
     * @return 模板指针引用。
     */
    HardwareTemplatePtr &getHardwareTemplate();

    /**
     * @brief ConnectingWindow::templateId
     * @details 获取当前模板 ID。
     * @return 模板 ID。
     */
    int templateId() const;
    /**
     * @brief ConnectingWindow::getCurrentDeviceRole
     * @details 返回当前激活的设备角色。
     * @return 设备角色。
     */
    DeviceRole getCurrentDeviceRole() const;
    /**
     * @brief ConnectingWindow::uncheckAllToolButtons
     * @details 取消所有节点按钮选中状态。
     */
    void uncheckAllToolButtons();
    /**
     * @brief ConnectingWindow::clearDevieRole
     * @details 重置当前/前一个角色记录。
     */
    void clearDevieRole();

signals:
    void sig_showDeviceInfo(DeviceRole preRole, DeviceRole curRole);
    void sig_nodeToggled(DeviceRole role, bool checked);
    // 同步设备型号列表和当前选择给属性面板
    void sig_syncModel(const QStringList list, const QString &text);

protected:
    /**
     * @brief ConnectingWindow::paintEvent
     * @details 绘制节点之间的连接线。
     * @param event 绘制事件。
     */
    void paintEvent(QPaintEvent *event) override;
    /**
     * @brief ConnectingWindow::eventFilter
     * @details 监听按钮移动尺寸变化以刷新连线。
     * @param watched 被监听对象。
     * @param event 发生事件。
     * @return 是否拦截事件。
     */
    bool eventFilter(QObject *watched, QEvent *event) override;

private slots:
    /**
     * @brief ConnectingWindow::slot_itemChanged
     * @details 当节点设备更换时同步相关状态。
     * @param item 新设备名称。
     */
    void slot_itemChanged(const QString &item);
    /**
     * @brief ConnectingWindow::slot_nodeToggled
     * @details 处理节点按钮切换选中状态。
     * @param checked 是否选中。
     */
    void slot_nodeToggled(bool checked);

private:
    // 工具：连接线管理（去重/可移除）
    /**
     * @brief ConnectingWindow::hasConnection
     * @details 判断两节点是否已有连接。
     */
    bool hasConnection(QToolButton *a, QToolButton *b) const;
    /**
     * @brief ConnectingWindow::addConnection
     * @details 添加两节点的连接线。
     */
    void addConnection(QToolButton *a, QToolButton *b);
    /**
     * @brief ConnectingWindow::removeConnection
     * @details 移除两节点之间的连接线。
     */
    void removeConnection(QToolButton *a, QToolButton *b);

private:
    // 节点
    NodeWidget *m_SIG = nullptr;
    NodeWidget *m_PA = nullptr;
    NodeWidget *m_RadANT = nullptr;
    NodeWidget *m_RecANT = nullptr;
    NodeWidget *m_FWD_PM = nullptr;
    NodeWidget *m_REV_PM = nullptr;
    NodeWidget *m_MON_PM = nullptr;
    NodeWidget *m_MON_Receiver = nullptr;
    NodeWidget *m_FD = nullptr;
    NodeWidget *m_CIP_Input = nullptr;
    NodeWidget *m_CIP_Monitor = nullptr;

    // 连接器节点
    NodeWidget *m_dbSIG2PA = nullptr;
    NodeWidget *m_dbFWD2PM = nullptr;
    NodeWidget *m_dbREV2PM = nullptr;
    NodeWidget *m_dbPA2Transducers = nullptr;
    NodeWidget *m_dbTransducers2PM = nullptr;

    QButtonGroup *m_buttonGroup = nullptr;

    // 连接线
    QList<QPair<QToolButton *, QToolButton *>> m_connections;

    QSet<QObject *> m_watchedLabels;
    QHash<QToolButton *, NodeWidget *> m_btn2Node; // 按钮→节点 映射

    QGridLayout *mainLayout = nullptr;
    HardwareTemplatePtr m_hwTemplateData = nullptr;
    HardwareTemplateType m_type;
    QString m_subRangeName;
    int m_templateID = 0;

    DeviceRole m_preRole = DeviceRole::Undefined; // 上一个激活设备
    DeviceRole m_curRole = DeviceRole::Undefined; // 当前激活设备

    bool m_loading = false; // 初始填充时屏蔽回调
};

#endif // CONNECTINGWINDOW_H
